/**
 * Toast通知工具
 * 提供全局通知功能
 */

// 用于存储消息回调的事件发射器
type ToastCallback = (message: string, type: ToastType) => void;
type ToastType = 'success' | 'error' | 'info' | 'warning';

const listeners: ToastCallback[] = [];

/**
 * 注册一个Toast监听器
 * @param callback 接收消息的回调函数
 * @returns 取消注册的函数
 */
export const registerToastListener = (callback: ToastCallback): () => void => {
  listeners.push(callback);
  return () => {
    const index = listeners.indexOf(callback);
    if (index !== -1) {
      listeners.splice(index, 1);
    }
  };
};

/**
 * 显示一个成功提示
 * @param message 提示消息
 */
export const showToast = (
  message: string, 
  type: ToastType = 'success',
  options?: { autoClose?: number }
): void => {
  listeners.forEach(listener => listener(message, type));
};

/**
 * 显示一个错误提示
 * @param message 错误消息
 */
export const showErrorToast = (
  message: string,
  options?: { autoClose?: number }
): void => {
  showToast(message, 'error', options);
};

/**
 * 显示一个信息提示
 * @param message 信息消息
 */
export const showInfoToast = (message: string): void => {
  showToast(message, 'info');
};

/**
 * 显示一个警告提示
 * @param message 警告消息
 */
export const showWarningToast = (message: string): void => {
  showToast(message, 'warning');
};

/**
 * 润色相关错误处理
 * 根据错误类型显示友好的错误消息
 * @param error 错误对象
 * @param contextInfo 上下文信息
 */
export const showPolishError = (error: Error | unknown, contextInfo?: string) => {
  console.error('润色出错:', error, contextInfo);
  
  // 根据错误类型显示不同的用户友好消息
  let userMessage = '润色过程中出现错误，请重试';
  
  if (error instanceof Error) {
    // 处理常见错误类型
    if (error.message.includes('timeout') || error.message.includes('超时')) {
      userMessage = '润色请求超时，请稍后重试或减少文本长度';
    } else if (error.message.includes('network') || error.message.includes('网络')) {
      userMessage = '网络连接问题，请检查网络后重试';
    } else if (error.message.includes('selection') || error.message.includes('选择')) {
      userMessage = '文本选择已失效，请重新选择文本后再试';
    } else if (error.message.includes('format') || error.message.includes('格式')) {
      userMessage = 'AI回复格式异常，无法提取润色结果';
    }
    
    // 添加上下文信息（如果有）
    if (contextInfo) {
      userMessage += `（${contextInfo}）`;
    }
  }
  
  showErrorToast(userMessage, { 
    autoClose: 5000  // 错误提示显示时间更长
  });
};

/**
 * 替换错误处理
 * 根据错误类型显示友好的替换错误消息
 * @param error 错误对象
 * @param selectedInfo 选择的文本信息
 */
export const showReplaceError = (error: Error | unknown, selectedInfo?: { sourceId?: string, text?: string }) => {
  console.error('替换文本错误:', error, selectedInfo);
  
  let userMessage = '替换文本失败，请重试';
  
  // 根据错误上下文提供更具体的信息
  if (error instanceof Error) {
    if (error.message.includes('selection') || error.message.includes('选择')) {
      userMessage = '原文选择已失效，请重新选择文本后再试';
    } else if (error.message.includes('match') || error.message.includes('匹配')) {
      userMessage = '文本已发生变化，无法精确定位替换位置，请重新选择';
    } else if (error.message.includes('source') || error.message.includes('来源')) {
      userMessage = '找不到原文档，可能已被移动或删除';
    }
  }
  
  // 如果没有源文档ID，那可能是文档未保存
  if (selectedInfo && (!selectedInfo.sourceId || selectedInfo.sourceId === '')) {
    userMessage = '无法定位源文档，请确保文档已保存';
  }
  
  showErrorToast(userMessage, { 
    autoClose: 5000
  });
}; 